package com.hxk.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

/**
 * 配置一个针对Calcu的aop日志记录类
 */
@Aspect//标注该类为aop类
public class CalcuAspectsLogs {

    /**
     * 配置一个切入点
     *     如果不配置切点，那么下面的@Before，@After，@AfterReturning，@AfterThrowing都需要配置"execution(public int com.hxk.aop.Calcu.*(..))"
     */
    @Pointcut("execution(public int com.hxk.aop.Calcu.*(..))")
    public void pointcut(){}

    /**
     * 配置一个执行目标方法的【前置通知】
     * @param joinPoint
     */
    @Before("pointcut()")//直接使用切入点
    public void logStart(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        System.out.println("AOP----"+name+"---Before---"+ Arrays.asList(args));
    }

    /**
     * 配置一个执行目标方法的【后置通知】
     * @param joinPoint
     */
    @After("com.hxk.aop.CalcuAspectsLogs.pointcut()")//使用全类名的方式配置
    public void logEnd(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();
        System.out.println("AOP----"+name+"---After---");
    }

    /**
     * 配置一个执行目标方法执行完毕发【返回通知】
     * @param joinPoint 当有多个参数时，该参数必须在方法参数列表的一个位
     * @param rs
     */
    @AfterReturning(value = "pointcut()", returning = "rs")
    public void logReturn(JoinPoint joinPoint, Object rs){
        String name = joinPoint.getSignature().getName();
        System.out.println("AOP----"+name+"---AfterReturning---"+rs);
    }

    /**
     * 配置有个执行目标方法出现异常发出的【异常通知】
     * @param joinPoint
     * @param e
     */
    @AfterThrowing(value = "pointcut()", throwing = "e")
    public void logException(JoinPoint joinPoint, Exception e){
        String name = joinPoint.getSignature().getName();
        System.out.println("AOP----"+name+"---AfterThrowing---"+e);
    }
}
